/*
 * @Descripttion:
 * @Author: yubo
 * @Date: 2022-08-19 09:36:59
 * @LastEditTime: 2022-08-19 09:41:30
 */
#include <rapidjson/pointer.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>

#include <iostream>

using namespace rapidjson;

int main(int, char *[])
{
    Document doc;
    if(!doc.IsNull())
        doc.Clear();

    // 使用 Set() 创建 DOM
    Pointer("/project").Set(doc, "RapidJSON");
    Pointer("/stars").Set(doc, 10);

    // { "project" : "RapidJSON", "stars" : 10 }

    // 使用 Get() 访问 DOM。若该值不存在则返回 nullptr。
    if (Value *stars = Pointer("/stars").Get(doc))
        stars->SetInt(stars->GetInt() + 1);

    // { "project" : "RapidJSON", "stars" : 11 }

    // Set() 和 Create() 自动生成父值（如果它们不存在）。
    Pointer("/a/b/0").Create(doc);

    // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] } }

    // GetWithDefault() 返回引用。若该值不存在则会深拷贝缺省值。
    Value &hello = Pointer("/hello").GetWithDefault(doc, "world");
    std::cout << hello.GetString() << '\n';
    // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "world" }

    // Swap() 和 Set() 相似
    Value x("C++");
    Pointer("/hello").Swap(doc, x);

    // { "project" : "RapidJSON", "stars" : 11, "a" : { "b" : [ null ] }, "hello" : "C++" }
    // x 变成 "world"

    // 删去一个成员或元素，若值存在返回 true
    //bool success = Pointer("/a").Erase(doc);
    //assert(success);

    // { "project" : "RapidJSON", "stars" : 10 }

    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    doc.Accept(writer);
 
    // Output {"project":"rapidjson","stars":11}
    std::cout << buffer.GetString() << std::endl;

    if(!doc.IsNull())
    {
        doc.RemoveAllMembers();
    }

    return 0;
}